﻿#define _CRT_SECURE_NO_WARNINGS 1

////错误的集合
////集合 s 包含从 1 到 n 的整数。不幸的是，因为数据错误，导致集合里面某一个数字复制了成了集合里面的另外一个数字的值，导致集合 丢失了一个数字 并且 有一个数字重复 。
////给定一个数组 nums 代表了集合 S 发生错误后的结果。
////请你找出重复出现的整数，再找到丢失的整数，将它们以数组的形式返回。
////
////示例 1：
////输入：nums = [1, 2, 2, 4]
////输出：[2, 3]
////
////示例 2：
////输入：nums = [1, 1]
////输出：[1, 2]
//
//int* findErrorNums(int* nums, int numsSize, int* returnSize)
//{
//    int* arr1 = (int*)calloc(sizeof(int), numsSize + 1);
//    int* arr2 = (int*)malloc(sizeof(int) * 2);
//    *returnSize = 2;
//    for (int i = 0; i < numsSize; i++)
//        arr1[nums[i]]++;
//    for (int i = 1; i <= numsSize; i++)
//    {
//        if (arr1[i] == 1)
//            continue;
//        else if (arr1[i] == 2)
//            arr2[0] = i;
//        else if (arr1[i] == 0)
//            arr2[1] = i;
//    }
//    return arr2;
//}











////两个数组的交集
////给定两个数组 nums1 和 nums2 ，返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
////
////示例 1：
////输入：nums1 = [1, 2, 2, 1], nums2 = [2, 2]
////输出：[2]
////
////示例 2：
////输入：nums1 = [4, 9, 5], nums2 = [9, 4, 9, 8, 4]
////输出：[9, 4]
////解释：[4, 9] 也是可通过的
//
//int compare(const void* p1, const void* p2)
//{
//    return *(int*)p1 - *(int*)p2;
//}
//int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {
//    *returnSize = 0;
//    int* arr = (int*)malloc(sizeof(int) * 1000);
//    qsort(nums1, nums1Size, sizeof(int), compare);
//    qsort(nums2, nums2Size, sizeof(int), compare);
//    for (int i = 0; i < nums1Size; i++)
//    {
//        if (i != 0 && nums1[i] == nums1[i - 1])
//            continue;
//        int left = 0;
//        int right = nums2Size - 1;
//        while (left <= right)
//        {
//            int mid = (left + right) / 2;
//            if (nums1[i] == nums2[mid])
//            {
//                arr[(*returnSize)++] = nums1[i];
//                break;
//            }
//            else if (nums1[i] > nums2[mid])
//                left = mid + 1;
//            else
//                right = mid - 1;
//        }
//    }
//    return arr;
//}












////自除数
////自除数 是指可以被它包含的每一位数整除的数。
////例如，128 是一个 自除数 ，因为 128 % 1 == 0，128 % 2 == 0，128 % 8 == 0。
////自除数 不允许包含 0 。
////给定两个整数 left 和 right ，返回一个列表，列表的元素是范围 [left, right] 内所有的 自除数 。
////
////示例 1：
////输入：left = 1, right = 22
////输出：[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]
////
////示例 2:
////输入：left = 47, right = 85
////输出：[48, 55, 66, 77]
//
//
//int* selfDividingNumbers(int left, int right, int* returnSize) {
//    *returnSize = 0;
//    int* arr = (int*)malloc(sizeof(int) * 1000);
//
//    for (int i = left; i <= right; i++)
//    {
//        int num = i;
//        while (num)
//        {
//            int ret = num % 10;
//            if (ret == 0 || i % ret != 0)
//            {
//                break;
//            }
//            num /= 10;
//        }
//        if (num == 0)
//            arr[(*returnSize)++] = i;
//    }
//    return arr;
//}













////除自身以外数组的乘积
////给你一个整数数组 nums，返回 数组 answer ，其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
////题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在  32 位 整数范围内。
////请不要使用除法，且在 O(n) 时间复杂度内完成此题。
////
////示例 1:
////输入: nums = [1, 2, 3, 4]
////输出 : [24, 12, 8, 6]
////
////示例 2 :
////输入 : nums = [-1, 1, 0, -3, 3]
////输出 : [0, 0, 9, 0, 0]
//
//int* productExceptSelf(int* nums, int numsSize, int* returnSize) {
//    int* arr = (int*)malloc(sizeof(int) * numsSize);
//    *returnSize = numsSize;
//    int left = 1;
//    int right = 1;
//    for (int i = 0; i < numsSize; i++)
//    {
//        arr[i] = left;
//        left *= nums[i];
//    }
//    for (int i = numsSize - 1; i >= 0; i--)
//    {
//        arr[i] *= right;
//        right *= nums[i];
//    }
//    return arr;
//}